Software for verifying the security of data files and computer programs is prevalent in many different contexts, such as operating system boot sequences, loading of program code or data files, web browsing, data communication, and data storage. Serial data processing algorithms such as those used for authentication and/or encryption can operate in a chained dependent fashion on a single buffer of data. Those algorithms can be constrained by serial chaining in that the output resulting from the processing of one block of data in the buffer is often required for the processing of a subsequent block.
For example, cryptographic hash functions such as MD5 (Message-Digest Algorithm) and SHA1, SHA256 and SHA512 (Secure Hash Algorithms) can be expensive in terms of computation on general-purpose processors. Such hash functions work sequentially on single buffers of data, updating a hash digest state with the computations derived from each data block and using a number of rounds of processing that are dependent on each other. The sequential processing of the blocks of the single buffer limits the performance on modern processors. Methods such as multi-buffer processing using vector Single Instruction Multiple Data (SIMD) units have been proposed for better performance in applications where it is possible to work on multiple independent data buffers; however, those methods are not applicable to applications involving the hashing of a single buffer. Tree hashing is another technique that has been used, albeit across multiple cores or engines.